package com.itstyle.seckill.topic.jvm;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Auther: liuwenxiang
 * @Date: 2020/3/24 22:44
 * @Description:
 */
public class TestInvoke {

    private   int i =10;

    public String a ="tt";

    public TestInvoke(){
        System.out.println("构造函数TestInvoke(无参数)执行");

    }

    public TestInvoke(int i,String a){
        this.i=i;
        this.a=a;
        System.out.println("构造函数TestInvoke(有参数)执行");

    }


    public void aa(int i,String a){
        System.out.println("测试");
    }

    public static void main(String[] args) {
        try {
            //根据类路径信息，得到类模版对象
            Class clszz = Class.forName("com.itstyle.seckill.topic.jvm.TestInvoke");
            //根据类模版对象，获取构造器对象
            Constructor constructor = clszz.getConstructor(int.class,String.class);
            //根据构造器对象，创建实例对象
            Object o = constructor.newInstance(2,"11");
            //调用对象方法
            ((TestInvoke)o).aa(2,"11");
            /**
             *  ps：直接clszz.newInstance()也可以创建对象，
             *  1.clszz.newInstance()实际是clszz.getConstructor.newInstance的缩写，只是他执行的是无参构造函数
             *  2.但是要获取对象属性，执行对象方法需要强制类型转换，那么通过Method和Field结合clszz.newInstance()就可以动态执行方法，获取属性
             *  3.newInstance/invoke/get
             */

            //获取Method对象
           /* Method methods =  clszz.getMethod("aa",int.class,String.class);
            //执行方法
            methods.invoke(clszz.newInstance(),2,"11");*/

            Field[] fields = clszz.getFields();
            for (int i=0;i<fields.length;i++) {
                Field field =fields[i];
                field.setAccessible(true);
                System.out.println(field.get(clszz.newInstance()));
            }



        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}
